using System;
using System.Collections.Generic;
using System.Text;
using Entidades;
using System.IO;
using System.Collections;

namespace Negocio
{
    public class GerarClassEntidadeMenfram
    {

       
        public void gerarNegocio(Hashtable hs, String path, string projeto, string modulo)
        {
            
            if (!System.IO.Directory.Exists(path + "\\Entidade\\"))
            {
                System.IO.Directory.CreateDirectory(path + "\\Entidade\\");
            }
            foreach (string key in hs.Keys)
            {
                Hashtable colunas = new Hashtable();
                String nomeClasse = key.Remove(0, 2) + "Entidade";
                String nomeSimples = key.Remove(0, 2);
                String nomeTable = key.Insert(2, "_").ToUpper();
                StreamWriter file = File.CreateText(path + "\\Entidade\\" + nomeClasse + ".cs");
                UtilsNegocio.geraCabecalho(file, projeto, modulo);
                TabelaEntidades tabela = (TabelaEntidades)hs[key];
                file.WriteLine("using System;");
                file.WriteLine("using System.Collections.Generic;");
                file.WriteLine("using System.Text;");
                file.WriteLine("using System.Data;");
                file.WriteLine("using Menfram.DAL.Reflection;");
                file.WriteLine("using Menfram.Entity.Interface;");
                file.WriteLine("using Comuns"+projeto+";"); ;
                String ConstanteNomeTabela = "ConstantesBanco." + nomeTable + "_NOME_TABELA";
                String ConstanteColunaChave = "ConstantesBanco." + nomeTable + "_" + tabela.ColunaChave;

                file.WriteLine("namespace Entidades");
                file.WriteLine("{");
                file.WriteLine("    /// <summary>");
                file.WriteLine("    ///  classe de Entidade referente a tabela: " + key);
                file.WriteLine("    /// </summary>");

                file.WriteLine("  [Table(TableName = " + ConstanteNomeTabela + ", SequenceName = " + ConstanteColunaChave + ", KeyName = " + ConstanteColunaChave + ", ClassName = \"Entidades." + nomeClasse + "\")]");
                file.WriteLine("    public class " + nomeClasse + ":IEntity");
                file.WriteLine("        {");

                foreach (ColunasEntidade var in tabela.Colunas)
                {
                    String tipo = " object ";
                    if (var.TipoColuna == "nchar" || var.TipoColuna == "varchar" || var.TipoColuna == "char" || var.TipoColuna == "nvarchar")
                    {
                        tipo = "String";
                    }

                    if (var.TipoColuna == "int")
                    {
                        tipo = "int ?";
                    }

                    if (var.TipoColuna == "bigint")
                    {
                        tipo = "long ?";
                    }

                    if (var.TipoColuna == "datetime" || var.TipoColuna == "timestamp")
                    {
                        tipo = "DateTime ?";
                    }

                    if (var.TipoColuna == "binary")
                    {
                        tipo = "byte []";
                    }

                    if (var.TipoColuna == "Image")
                    {
                        tipo = "byte []";
                    }

                    if (var.TipoColuna == "bit")
                    {
                        tipo = "bool ?";
                    }

                    if (var.TipoColuna == "decimal" || var.TipoColuna == "numeric" || var.TipoColuna == "float" || var.TipoColuna =="double")
                    {
                        tipo = "Decimal ? ";
                    }
                    string saida = UtilsNegocio.geraNomeAtributo(var.NomeColuna);
                    if (!colunas.Contains(saida))
                    {
                        colunas.Add(saida,null);
                        saida = UtilsNegocio.geraNomeAtributo(var.NomeColuna);
                    }
                    else {
                        saida = UtilsNegocio.geraNomeAtributo(var.NomeColuna,true);
                    }
                    
                    UtilsNegocio.geraAtributo(file, saida, tipo,tabela.NomeTabela, var.NomeColuna);
                    file.WriteLine();
                }

                file.WriteLine("/* representa o campo chave da tabela " + tabela.NomeTabela + "*/");
                file.WriteLine("\t\t\t public string Key { ");
                file.WriteLine("\t\t\t  get { return Sequencial.ToString(); }");
                file.WriteLine("\t\t\t    }");
                file.WriteLine("\n\n");

                file.WriteLine("/* representa o campo DescricaoCombo da tabela " + tabela.NomeTabela + "*/");
                file.WriteLine("\t\t\t public string DescriptionComboBox { ");
                file.WriteLine("\t\t\t get { return Sequencial.ToString(); }");
                file.WriteLine("\t\t}");
                file.WriteLine("\t}");
                file.WriteLine("}");
                file.Flush();
                file.Close();
            }
        }
    }
}
